#include <header.h>

/**
 * 4. fork创建一个子进程，两个进程访问同一段共享内存，共享内存里保存一个整形数，父子进程用for循环的方式。每次对这个整形数字加1，父子进程各循环1000万次。
 * 加完后打印一下共享内存里的数字，看看是多少？
*/
int main(int argc, char* argv[]){
	key_t keytag = ftok(".", 1); // 获得key标记
	ERROR_CHECK(keytag, -1, "ftok");
	
	int shmid = shmget(keytag, 4096, 0600|IPC_CREAT);// 产生共享内存
	ERROR_CHECK(shmid, -1, "shmget");

	pid_t pid = fork();
	ERROR_CHECK(pid, -1, "fork");
	int *p = (int*)shmat(shmid, NULL, 0);
	p[0] = 0;

	if(pid == 0){
		// child
		for (size_t i = 0; i < 1000000; i++){
			p[0]++;
		}
		
		printf("child:%d\n", p[0]);
		if(shmdt(p) < 0){
			perror("shmdt");
			exit(-1);
		}

	}else{
		// father
		for (size_t i = 0; i < 1000000; i++){
			p[0]++;
		}		

		printf("father:%d\n", p[0]);
		// 只是解除映射。并没有删除
		if(shmdt(p) < 0){
			perror("shmdt");
			exit(-1);
		}

		int ret1 = shmctl(shmid, IPC_RMID, NULL);
		ERROR_CHECK(ret1, -1, "remove shm");

		pid_t ret2 = wait(NULL);
		ERROR_CHECK(ret2, -1, "wait");
		
	}
	return 0;
}


/**
 * child:869888
 * father:1189559
*/